ããã³ããšã³ãã§ã®ãªã¢ã«ã¿ã€ã WebRTCæ¥ç¶å質ã¢ãã¿ãªã³ã°ãç¿åŸããŸããããæ¥ç¶ã®å®å®æ§ãè©äŸ¡ããåé¡ãç¹å®ããå®è·µçãªææ³ãšã³ãŒãäŸã§ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåäžãããæ¹æ³ãåŠã³ãŸãã
ããã³ããšã³ãWebRTCæ¥ç¶å質ã¢ãã¿ãªã³ã°ïŒæé©ãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®ããã®ãªã¢ã«ã¿ã€ã è©äŸ¡
ãªã¢ã«ã¿ã€ã ã³ãã¥ãã±ãŒã·ã§ã³ïŒRTCïŒã¯ãç§ãã¡ãäžçäžã§äº€æµããååããããžãã¹ãè¡ãæ¹æ³ãå€é©ããŠããŸããWebRTCã¯ã匷åãªãªãŒãã³ãœãŒã¹ãããžã§ã¯ãã§ããããããªäŒè°ããªã³ã©ã€ã³ã²ãŒã ããé éå»çãæè²ãŸã§ããããã®ãªã¢ã«ã¿ã€ã äœéšã®å€ããæ¯ããŠããŸããããããã·ãŒã ã¬ã¹ã§ä¿¡é Œæ§ã®é«ãWebRTCãšã¯ã¹ããªãšã³ã¹ã¯ãäžè²«ããæ¥ç¶å質ã«ããã£ãŠããŸãããã®ããã°èšäºã§ã¯ãããã³ããšã³ãWebRTCæ¥ç¶å質ã¢ãã¿ãªã³ã°ã®éèŠãªåŽé¢ãæãäžããã¢ããªã±ãŒã·ã§ã³ã§ã®ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãç©æ¥µçã«è©äŸ¡ããã³æé©åããããã®ç¥èãšããŒã«ãæäŸããŸãã
ããã³ããšã³ãã§WebRTCæ¥ç¶å質ãã¢ãã¿ãªã³ã°ããçç±
ãããã¯ãŒã¯ã€ã³ãã©ã¹ãã©ã¯ãã£ãšãµãŒããŒãµã€ãã®æé©åã¯WebRTCå šäœã®ããã©ãŒãã³ã¹ã«ãããŠéèŠãªåœ¹å²ãæãããŸãããããã³ããšã³ãã§çŽæ¥æ¥ç¶å質ãã¢ãã¿ãªã³ã°ããããšã¯ãå®éã®ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã«é¢ãã貎éãªæŽå¯ãæäŸããŸãããã®éèŠæ§ã¯ä»¥äžã®éãã§ãã
- ãŠãŒã¶ãŒäžå¿ã®èŠç¹: ããã³ããšã³ãã¯ããŠãŒã¶ãŒããããã¯ãŒã¯ç¶æ³ã®åœ±é¿ãçŽæ¥èªèããå Žæã§ããã¢ãã¿ãªã³ã°ã«ããããªãŒãã£ãªãšãããªã®å質ãé å»¶ãå šäœçãªãšã¯ã¹ããªãšã³ã¹ãåæ ãããªã¢ã«ã¿ã€ã ã¡ããªã¯ã¹ããã£ããã£ã§ããŸãã
- ç©æ¥µçãªå顿€åº: æ¥ç¶ã®åé¡ãæ©æã«ç¹å®ããããšã§ããããªå質ã®èª¿æŽã代æ¿ãããã¯ãŒã¯ãªãã·ã§ã³ã®ææ¡ããŠãŒã¶ãŒãžã®åœ¹ç«ã€ãã©ãã«ã·ã¥ãŒãã£ã³ã°ãã³ãã®æäŸãªã©ãç©æ¥µçãªå¯Ÿçãè¬ããããšãã§ããŸãã
- çãçµã£ãæé©å: ããã³ããšã³ãã¢ãã¿ãªã³ã°ã¯ããšã³ã³ãŒãã£ã³ã°ãã©ã¡ãŒã¿ã®æé©åããããã¬ãŒãèšå®ã®èª¿æŽãã·ã°ããªã³ã°åé¡ãžã®å¯ŸåŠãªã©ãæ¹åã®ããã®å ·äœçãªé åãç¹å®ããããŒã¿ãæäŸããŸãã
- ãµããŒãã³ã¹ãã®åæž: æ¥ç¶ã®åé¡ãäºåã«ç¹å®ããŠè§£æ±ºããããšã§ããµããŒããªã¯ãšã¹ããå€§å¹ ã«åæžãããŠãŒã¶ãŒæºè¶³åºŠãåäžãããããšãã§ããŸãã
- ããŒã¿é§ååã®æææ±ºå®: ãªã¢ã«ã¿ã€ã ã¡ããªã¯ã¹ã¯ããŠãŒã¶ãŒã®è¡åãçè§£ããããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããã€ã³ãã©ã¹ãã©ã¯ãã£ã®ã¢ããã°ã¬ãŒããã¢ããªã±ãŒã·ã§ã³ã®æé©åã«ã€ããŠæ å ±ã«åºã¥ããæææ±ºå®ãè¡ãããã®è²ŽéãªããŒã¿ãæäŸããŸãã
äž»èŠãªWebRTCã¡ããªã¯ã¹ãçè§£ãã
å®è£
ã«å
¥ãåã«ãWebRTCæ¥ç¶å質ã«é¢ããæŽå¯ãæäŸããäž»èŠãªã¡ããªã¯ã¹ãçè§£ããããšãéèŠã§ãããããã®ã¡ããªã¯ã¹ã¯éåžžãWebRTC API (RTCPeerConnection.getStats()) ãä»ããŠå
¬éãããæ¥ç¶ã®å¥å
šæ§ã®è©³çްãªãã¥ãŒãæäŸããŸãã
ãªã¢ã«ã¿ã€ã è©äŸ¡ã®ããã®å¿ é ã¡ããªã¯ã¹
- ãã±ãããã¹: éä¿¡äžã«å€±ããããã±ããã®å²åãé«ããã±ãããã¹ã¯ããªãŒãã£ãªããã³ãããªå質ã«çŽæ¥åœ±é¿ãäžããã°ãªãããããªãŒãºããªãŒãã£ãªã®éåããåŒãèµ·ãããŸãã
- é å»¶ïŒRound-Trip Time - RTTïŒ: ãã±ããããããã¢ããå¥ã®ãã¢ã«ç§»åããŠæ»ããŸã§ã®æéãé«ãé å»¶ã¯éä¿¡ã«é ããããããããªã¢ã«ã¿ã€ã ã®å¯Ÿè©±ãå°é£ã«ããŸãã
- ãžãã¿ãŒ: æéçµéã«äŒŽãé å»¶ã®å€åãå¹³åé å»¶ã蚱容ç¯å²å ã§ãã£ãŠããé«ããžãã¿ãŒã¯ãªãŒãã£ãªããã³ãããªã®æªã¿ãåŒãèµ·ããå¯èœæ§ããããŸãã
- 垯åå¹ : ããŒã¿éä¿¡ã«å©çšå¯èœãªãããã¯ãŒã¯å®¹éã垯åå¹ ãäžè¶³ãããšãé«å質ã®ãªãŒãã£ãªãšãããªãéä¿¡ããèœåãå¶éãããŸãã
- ãããã¬ãŒã: ããŒã¿ãéä¿¡ãããé床ããããã¬ãŒããç£èŠããããšã§ãã¢ããªã±ãŒã·ã§ã³ãå©çšå¯èœãªåž¯åå¹ ãã©ã®ããã«æŽ»çšããŠããããçè§£ã§ããŸãã
- ã³ãŒããã¯: ãªãŒãã£ãªããã³ãããªã«äœ¿çšããããšã³ã³ãŒãããã³ãã³ãŒãã¢ã«ãŽãªãºã ãç¹å®ã®ã³ãŒããã¯ã¯ä»ã®ã³ãŒããã¯ãããå¹ççã§ãããç¹å®ã®ãããã¯ãŒã¯ç¶æ³äžã§ããè¯ãããã©ãŒãã³ã¹ãçºæ®ããå ŽåããããŸãã
- ãã¬ãŒã ã¬ãŒãïŒFPSïŒ: 1ç§ãããã«éä¿¡ããããããªãã¬ãŒã ã®æ°ãäœãFPSã¯éåãããããªã«ãªããŸãã
- è§£å床: ãããªã¹ããªãŒã ã®å¯žæ³ïŒäŸïŒ1280x720ïŒãé«è§£å床ã«ã¯ããå€ãã®åž¯åå¹ ãå¿ èŠã§ãã
- ãªãŒãã£ãªã¬ãã«: ãªãŒãã£ãªã¹ããªãŒã ã®é³éã¬ãã«ããªãŒãã£ãªã¬ãã«ãç£èŠããããšã§ããã€ã¯å ¥åãŸãã¯ãªãŒãã£ãªãšã³ã³ãŒãã£ã³ã°ã«é¢ããæœåšçãªåé¡ãç¹å®ã§ããŸãã
- CPU䜿çšç: WebRTCã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠæ¶è²»ãããCPUãªãœãŒã¹ã®éãé«ãCPU䜿çšçã¯ããã©ãŒãã³ã¹ã«åœ±é¿ãäžãããã¬ãŒã èœã¡ããªãŒãã£ãªã°ãªããã«ã€ãªããå¯èœæ§ããããŸãã
ã¡ããªã¯ã¹å€ã®è§£éïŒãããå€ãšã³ã³ããã¹ã
ãããã®ã¡ããªã¯ã¹ã广çã«è§£éããã«ã¯ãé©åãªéŸå€ãçè§£ããã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ããã¹ããèæ ®ããããšãéèŠã§ããããšãã°ããããªäŒè°ã¢ããªã±ãŒã·ã§ã³ã®èš±å®¹å¯èœãªé å»¶ã¯ããªã³ã©ã€ã³ã²ãŒã ã®ãããšã¯ç°ãªãå ŽåããããŸãã
以äžã¯ãããã€ãã®äž»èŠãªã¡ããªã¯ã¹ãè§£éããããã®äžè¬çãªã¬ã€ãã©ã€ã³ã§ãã
- ãã±ãããã¹:
- 0-1%: åªç§ - ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãžã®åœ±é¿ã¯æå°éã§ãã
- 1-5%: 蚱容ç¯å² - ææã°ãªããã«æ°ã¥ãå ŽåããããŸãã
- 5-10%: é¡èãªåœ±é¿ - é »ç¹ãªãªãŒãã£ãª/ãããªã®æªã¿ã
- >10%: 蚱容äžå¯ - ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãèããäœäžããŸãã
- é
å»¶ïŒRTTïŒ:
- <150ms: åªç§ - ã»ãŒãªã¢ã«ã¿ã€ã ã®å¯Ÿè©±ã
- 150-300ms: 蚱容ç¯å² - ããããªé å»¶ããããŸãããäžè¬çã«äœ¿çšå¯èœã§ãã
- 300-500ms: é¡èãªé å»¶ - éä¿¡ãå°é£ã«ãªããŸãã
- >500ms: 蚱容äžå¯ - èããé å»¶ãããããªã¢ã«ã¿ã€ã ã®å¯Ÿè©±ãéåžžã«å°é£ã«ãªããŸãã
- ãžãã¿ãŒ:
- <30ms: åªç§ - 圱é¿ã¯æå°éã§ãã
- 30-50ms: 蚱容ç¯å² - ããããªæªã¿ã«æ°ã¥ãå ŽåããããŸãã
- 50-100ms: é¡èãªæªã¿ - ãªãŒãã£ãª/ãããªå質ã«åœ±é¿ãåºãŸãã
- >100ms: 蚱容äžå¯ - èããæªã¿ãšæœåšçãªéåãã
ãããã¯äžè¬çãªã¬ã€ãã©ã€ã³ã«ããããã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠèš±å®¹ãããå ·äœçãªãããå€ã¯ç°ãªãå ŽåããããŸãããŠãŒã¹ã±ãŒã¹ã«æé©ãªéŸå€ã決å®ããããã«ãå®éšãããŒã¿ãåéããããšãéèŠã§ãã
ããã³ããšã³ãWebRTCæ¥ç¶å質ã¢ãã¿ãªã³ã°ã®å®è£
ããã§ã¯ãJavaScriptãšWebRTC APIã䜿çšããŠããã³ããšã³ãWebRTCæ¥ç¶å質ã¢ãã¿ãªã³ã°ãå®è£ ããæ¹æ³ãèŠãŠãããŸãããã
1. WebRTCçµ±èšãžã®ã¢ã¯ã»ã¹
WebRTCçµ±èšã«ã¢ã¯ã»ã¹ããäž»èŠãªæ¹æ³ã¯ãRTCPeerConnection.getStats() ã¡ãœããã§ãããã®ã¡ãœããã¯ãçµ±èšãªããžã§ã¯ãã®ã³ã¬ã¯ã·ã§ã³ãå«ã RTCStatsReport ãªããžã§ã¯ãã§è§£æ±ºãããPromiseãè¿ããŸããçµæçãªããŒã¿ãåéããããã«ããã®ã¡ãœããã宿çã«åŒã³åºãå¿
èŠããããŸãã
\nasync function getWebRTCStats(peerConnection) {\n try {\n const statsReport = await peerConnection.getStats();\n statsReport.forEach(stat => {\n // Process each statistic object\n console.log(stat.type, stat);\n });\n } catch (error) {\n console.error('Error getting WebRTC stats:', error);\n }\n}\n\n// Call this function periodically, e.g., every second\nsetInterval(() => getWebRTCStats(peerConnection), 1000);\n
2. çµ±èšã®åŠçãšåæ
RTCStatsReport ã«ã¯è±å¯ãªæ
å ±ãå«ãŸããŠããŸãããæå³ã®ããæŽå¯ãæœåºããããã«ããŒã¿ãåŠçããã³åæããã®ã¯ããªãã®è²¬ä»»ã§ããçµ±èšã¯ãinbound-rtpãoutbound-rtpãremote-inbound-rtpãremote-outbound-rtpãcandidate-pair ãªã©ãããŸããŸãªã¿ã€ãã«åé¡ãããŠããŸããåã¿ã€ãã«ã¯ãæ¥ç¶ã®ãã®åŽé¢ã«é¢é£ããç°ãªãããããã£ãå«ãŸããŠããŸãã
以äžã¯ãçµ±èšãããã±ãããã¹ãšé å»¶ãæœåºããæ¹æ³ã®äŸã§ãã
\nasync function processWebRTCStats(peerConnection) {\n try {\n const statsReport = await peerConnection.getStats();\n let inboundRtpStats = null;\n let outboundRtpStats = null;\n let candidatePairStats = null;\n\n statsReport.forEach(stat => {\n if (stat.type === 'inbound-rtp' && stat.kind === 'video') { // or 'audio'\n inboundRtpStats = stat;\n }\n if (stat.type === 'outbound-rtp' && stat.kind === 'video') {\n outboundRtpStats = stat;\n }\n if (stat.type === 'candidate-pair' && stat.state === 'succeeded') {\n candidatePairStats = stat;\n }\n });\n\n if (inboundRtpStats) {\n const packetsLost = inboundRtpStats.packetsLost;\n const packetsReceived = inboundRtpStats.packetsReceived;\n const packetLossRatio = packetsReceived ? packetsLost / packetsReceived : 0;\n console.log('Packet Loss Ratio (Inbound):', packetLossRatio);\n }\n\n if (candidatePairStats) {\n const rtt = candidatePairStats.currentRoundTripTime * 1000; // Convert to milliseconds\n console.log('Round Trip Time (RTT):', rtt, 'ms');\n }\n\n } catch (error) {\n console.error('Error processing WebRTC stats:', error);\n }\n}\n\nsetInterval(() => processWebRTCStats(peerConnection), 1000);\n
3. æ¥ç¶å質ã®èŠèŠå
æ¥ç¶å質ã¡ããªã¯ã¹ãæç¢ºãã€çŽæçãªæ¹æ³ã§æç€ºããããšã¯ããŠãŒã¶ãŒã«å®çšçãªæ å ±ãæäŸããããã«äžå¯æ¬ ã§ããããã³ããšã³ãã§WebRTCçµ±èšãèŠèŠåããæ¹æ³ã¯ããã€ããããŸãã
- åºæ¬çãªããã¹ã衚瀺: çã®ã¡ããªã¯ã¹å€ïŒäŸïŒãã±ãããã¹ãé å»¶ïŒãç»é¢ã«çŽæ¥è¡šç€ºããŸããããã¯æãç°¡åãªã¢ãããŒãã§ãããæããŠãŒã¶ãŒãã¬ã³ããªãŒã§ã¯ãªããããããŸããã
- ã°ã©ããšãã£ãŒã: Chart.jsãD3.jsã®ãããªã©ã€ãã©ãªã䜿çšããŠãæéçµéã«äŒŽãã¡ããªã¯ã¹ãèŠèŠåããåçãªã°ã©ãããã£ãŒããäœæããŸããããã«ããããŠãŒã¶ãŒã¯åŸåããã¿ãŒã³ãç°¡åã«èå¥ã§ããŸãã
- è²åããããã€ã³ãžã±ãŒã¿ãŒ: äºåå®çŸ©ããããããå€ã«åºã¥ããŠãå šäœçãªæ¥ç¶å質ã衚ãè²åããããã€ã³ãžã±ãŒã¿ãŒïŒäŸïŒç·ãé»ãèµ€ïŒã䜿çšããŸããããã«ããããŠãŒã¶ãŒã¯æ¥ç¶ã¹ããŒã¿ã¹ããã°ããç°¡åã«çè§£ã§ããŸãã
- ã«ã¹ã¿ã UIèŠçŽ : æ¥ç¶å質æ å ±ãèŠèŠçã«é åçã§æ å ±éã®å€ãæ¹æ³ã§è¡šç€ºããã«ã¹ã¿ã UIèŠçŽ ãäœæããŸããããã«ãããã¢ããªã±ãŒã·ã§ã³ãšãŠãŒã¶ãŒã®ç¹å®ã®ããŒãºã«åãããŠãã¬ãŒã³ããŒã·ã§ã³ã調æŽã§ããŸãã
以äžã¯ãåºæ¬çãªããã¹ã衚瀺ãšè²åããããã€ã³ãžã±ãŒã¿ãŒã䜿çšããäŸã§ãã
\nfunction updateConnectionQualityUI(packetLossRatio, rtt) {\n const packetLossElement = document.getElementById('packet-loss');\n const latencyElement = document.getElementById('latency');\n const connectionQualityElement = document.getElementById('connection-quality');\n\n packetLossElement.textContent = `Packet Loss: ${(packetLossRatio * 100).toFixed(2)}%`;\n latencyElement.textContent = `Latency: ${rtt} ms`;\n\n let connectionQuality = 'Good';\n let color = 'green';\n\n if (packetLossRatio > 0.05 || rtt > 300) {\n connectionQuality = 'Poor';\n color = 'red';\n } else if (packetLossRatio > 0.01 || rtt > 150) {\n connectionQuality = 'Fair';\n color = 'yellow';\n }\n\n connectionQualityElement.textContent = `Connection Quality: ${connectionQuality}`;\n connectionQualityElement.style.color = color;\n}\n\n// Call this function with the processed statistics\nupdateConnectionQualityUI(packetLossRatio, rtt);\n
4. ãããã¯ãŒã¯ç¶æ³ãžã®é©å¿
ãªã¢ã«ã¿ã€ã æ¥ç¶å質ã¢ãã¿ãªã³ã°ã®äž»ãªå©ç¹ã®1ã€ã¯ãå€åãããããã¯ãŒã¯ç¶æ³ã«åçã«é©å¿ã§ããããšã§ããããã«ã¯ãã¹ã ãŒãºã§ä¿¡é Œæ§ã®é«ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãç¶æããããã«ããããªå質ããããã¬ãŒãããã®ä»ã®ãã©ã¡ãŒã¿ã調æŽããããšãå«ãŸããŸãã
以äžã«ããããã¯ãŒã¯ç¶æ³ã«é©å¿ããããã®ããã€ãã®äžè¬çãªæŠç¥ã瀺ããŸãã
- ã¢ãããã£ããããã¬ãŒãã¹ããªãŒãã³ã° (ABR): å©çšå¯èœãªåž¯åå¹ ãšãããã¯ãŒã¯ç¶æ³ã«åºã¥ããŠããããªãããã¬ãŒããåçã«èª¿æŽããŸããããã«ããããããªã¹ããªãŒã ãåžžã«çŸåšã®ãããã¯ãŒã¯ç°å¢ã«æé©åãããŸãã
- è§£å床åãæ¿ã: 垯åå¹ ãå¶éãããŠããå Žåã«ãããäœããããªè§£å床ã«åãæ¿ããŸããããã«ãããéä¿¡ãããããŒã¿éãæžå°ããå®å®æ§ãåäžããé å»¶ãäœæžãããŸãã
- ãã¬ãŒã ã¬ãŒã調æŽ: ãããã¯ãŒã¯ç¶æ³ãæªãå Žåã«ãã¬ãŒã ã¬ãŒããäžããŸããããã«ãããè§£å床ãäœãå Žåã§ããããã¹ã ãŒãºãªãããªã¹ããªãŒã ãç¶æããã®ã«åœ¹ç«ã¡ãŸãã
- ã³ãŒããã¯éžæ: 垯åå¹ ãå¶éãããŠããå Žåã«ãããå¹ççãªã³ãŒããã¯ãéžæããŸããäžéšã®ã³ãŒããã¯ã¯ä»ã®ã³ãŒããã¯ãããå¹ççã§ãããããäœããããã¬ãŒãã§ããè¯ãå質ãæäŸã§ããŸãã
- ãµã€ãã«ãã£ã¹ã: ç°ãªãè§£å床ãšãããã¬ãŒãã§è€æ°ã®ãããªã¹ããªãŒã ãéä¿¡ããŸããåä¿¡è ã¯ãçŸåšã®ãããã¯ãŒã¯ç¶æ³ã«æé©ãªã¹ããªãŒã ãéžæã§ããŸãã
ãããã®æŠç¥ãå®è£
ããã«ã¯ãWebRTC APIã䜿çšããŠããŸããŸãªãšã³ã³ãŒãã£ã³ã°ããã³éä¿¡ãã©ã¡ãŒã¿ãå¶åŸ¡ã§ããŸããããšãã°ãRTCRtpSender.getParameters() ããã³ RTCRtpSender.setParameters() ã¡ãœããã䜿çšããŠããããã¬ãŒãããã®ä»ã®ãšã³ã³ãŒãã£ã³ã°ãã©ã¡ãŒã¿ã調æŽã§ããŸãã
\nasync function adjustBitrate(peerConnection, newBitrate) {\n try {\n const senders = peerConnection.getSenders();\n for (const sender of senders) {\n if (sender.track && sender.track.kind === 'video') {\n const parameters = sender.getParameters();\n if (!parameters.encodings) {\n parameters.encodings = [{}];\n }\n parameters.encodings[0].maxBitrate = newBitrate; // in bits per second\n await sender.setParameters(parameters);\n console.log('Video bitrate adjusted to:', newBitrate);\n }\n }\n } catch (error) {\n console.error('Error adjusting bitrate:', error);\n }\n}\n\n// Call this function when network conditions change\nadjustBitrate(peerConnection, 500000); // 500 kbps\n
é«åºŠãªãã¯ããã¯ãšèæ ®äºé
åºæ¬çãªå®è£ ãè¶ ããŠãWebRTCæ¥ç¶å質ã®ã¢ãã¿ãªã³ã°ãšæé©åã®åãçµã¿ãããã«åŒ·åã§ããé«åºŠãªãã¯ããã¯ãšèæ ®äºé ãããã€ããããŸãã
1. ãããã¯ãŒã¯èšºæããŒã«
ãŠãŒã¶ãŒã«ãããã¯ãŒã¯æ¥ç¶ã«é¢ããæ å ±ãæäŸããããã«ããããã¯ãŒã¯èšºæããŒã«ãçµ±åããŸãããããã®ããŒã«ã¯ã垯åå¹ ãé å»¶ããã±ãããã¹ã枬å®ãããã¹ããå®è¡ã§ãããŠãŒã¶ãŒãæœåšçãªãããã¯ãŒã¯ã®åé¡ãç¹å®ããã®ã«åœ¹ç«ã¡ãŸãã
- Speedtest.netãšã®çµ±å: Speedtest.netã®é床ãã¹ãæ©èœãã¢ããªã±ãŒã·ã§ã³å ã«çµã¿èŸŒã¿ãŸããããã¯ãåã蟌ã¿å¯èœãªãŠã£ãžã§ãããŸãã¯APIãä»ããŠå®çŸã§ããŸãã
- ã«ã¹ã¿ã ãããã¯ãŒã¯ãã¹ã: ICMPïŒpingïŒãã±ãããéä¿¡ããŠé å»¶ãæž¬å®ããããHTTPãªã¯ãšã¹ãã䜿çšããŠåž¯åå¹ ãæž¬å®ããããããªã©ã®ãã¯ããã¯ã䜿çšããŠãç¬èªã®ãããã¯ãŒã¯ãã¹ããéçºããŸãã
2. ã·ã°ããªã³ã°ãµãŒããŒãšã®çµ±å
ã·ã°ããªã³ã°ãµãŒããŒã¯ãWebRTCæ¥ç¶ã®ç¢ºç«ã«ãããŠéèŠãªåœ¹å²ãæãããŸããã·ã°ããªã³ã°ããã»ã¹ãç£èŠããããšã§ãæœåšçãªæ¥ç¶åé¡ã«é¢ãã貎éãªæŽå¯ãåŸãããšãã§ããŸãã
- ã·ã°ããªã³ã°é å»¶: ã·ã°ããªã³ã°ã¡ãã»ãŒãžããã¢éã§äº€æãããã®ã«ãããæéãæž¬å®ããŸããé«ãã·ã°ããªã³ã°é å»¶ã¯ãã·ã°ããªã³ã°ãµãŒããŒãŸãã¯ãããã¯ãŒã¯æ¥ç¶ã®åé¡ã瀺ããŠããå¯èœæ§ããããŸãã
- ã·ã°ããªã³ã°ãšã©ãŒ: ICEåè£åéã®å€±æãæ¥ç¶ã®å€±æãªã©ãã·ã°ããªã³ã°ããã»ã¹äžã®ãšã©ãŒãç£èŠããŸãã
3. TURNãµãŒããŒã®ã¢ãã¿ãªã³ã°
TURNïŒTraversal Using Relays around NATïŒãµãŒããŒã¯ãNATïŒãããã¯ãŒã¯ã¢ãã¬ã¹å€æïŒã®å¶éã«ããçŽæ¥ãã¢ããŒãã¢æ¥ç¶ãäžå¯èœãªå Žåã«ã¡ãã£ã¢ãã©ãã£ãã¯ãäžç¶ããããã«äœ¿çšãããŸããTURNãµãŒããŒã®äœ¿çšç¶æ³ãšããã©ãŒãã³ã¹ãç£èŠããããšã§ãæœåšçãªããã«ããã¯ãç¹å®ããã®ã«åœ¹ç«ã¡ãŸãã
- TURNãµãŒããŒã®è² è·: TURNãµãŒããŒäžã®åææ¥ç¶æ°ãšåž¯åå¹ ã®äœ¿çšç¶æ³ãç£èŠããŸãã
- TURNãµãŒããŒã®é å»¶: ãã¢ãšTURNãµãŒããŒéã®é å»¶ãæž¬å®ããŸãã
4. ãŠãŒã¶ãŒãã£ãŒãããã¯ã¡ã«ããºã
æ¥ç¶å質ã«é¢ãã䞻芳çãªãã£ãŒãããã¯ãåéããããã«ããŠãŒã¶ãŒãã£ãŒãããã¯ã¡ã«ããºã ãå®è£ ããŸããããã«ã¯ããŠãŒã¶ãŒã«ãšã¯ã¹ããªãšã³ã¹ãè©äŸ¡ããŠããã£ããããªãŒãã£ãªããã³ãããªå質ã«é¢ããå ·äœçãªãã£ãŒãããã¯ãæäŸããŠããã£ããããããšãå«ãŸããŸãã
- è©äŸ¡å°ºåºŠ: ãŠãŒã¶ãŒãå šäœçãªãšã¯ã¹ããªãšã³ã¹ãè©äŸ¡ã§ããããã«ãè©äŸ¡å°ºåºŠïŒäŸïŒ1ïœ5ã€æïŒã䜿çšããŸãã
- èªç±åœ¢åŒã®ãã£ãŒãããã¯: ãŠãŒã¶ãŒããã詳现ãªãã£ãŒãããã¯ãæäŸã§ããããã«ãèªç±åœ¢åŒã®ããã¹ããã£ãŒã«ããæäŸããŸãã
5. ããã€ã¹ãšãã©ãŠã¶ã®äºææ§
WebRTCã¢ããªã±ãŒã·ã§ã³ãå¹ åºãããã€ã¹ãšãã©ãŠã¶ãšäºææ§ãããããšã確èªããŠãã ãããç°ãªãããã€ã¹ãšãã©ãŠã¶ã¯ãç°ãªãWebRTCå®è£ ãšããã©ãŒãã³ã¹ç¹æ§ãæã£ãŠããå ŽåããããŸãã
- 宿çãªãã¹ã: äºææ§ã®åé¡ãç¹å®ããããã«ãããŸããŸãªããã€ã¹ããã©ãŠã¶ã§ã¢ããªã±ãŒã·ã§ã³ããã¹ãããŸãã
- ãã©ãŠã¶åºæã®æé©å: ããã©ãŒãã³ã¹ãåäžãããããã«ããã©ãŠã¶åºæã®æé©åãå®è£ ããŸãã
6. ã¢ãã€ã«ã«é¢ããèæ ®äºé
ã¢ãã€ã«ãããã¯ãŒã¯ã¯éåžžã«å€åãããããä¿¡å·åŒ·åºŠãšåž¯åå¹ ãé »ç¹ã«å€åããåŸåããããŸããã¢ãã€ã«ç°å¢åãã«WebRTCã¢ããªã±ãŒã·ã§ã³ãæé©åããŠãã ããã
- ã¢ãããã£ããããã¬ãŒãã¹ããªãŒãã³ã° (ABR): å©çšå¯èœãªåž¯åå¹ ã«åºã¥ããŠãããªãããã¬ãŒããåçã«èª¿æŽããããã«ABRãå®è£ ããŸãã
- ãããã¯ãŒã¯å€æŽæ€åº: ãããã¯ãŒã¯ã®å€æŽïŒäŸïŒWi-Fiããã»ã«ã©ãŒãžïŒãæ€åºããããã«å¿ããŠã¢ããªã±ãŒã·ã§ã³ã調æŽããŸãã
- ããããªãŒæé©å: ããããªãŒæ¶è²»ãæå°éã«æããããã«ã¢ããªã±ãŒã·ã§ã³ãæé©åããŸãã
WebRTCå±éã«ãããã°ããŒãã«ãªèæ ®äºé
WebRTCã¢ããªã±ãŒã·ã§ã³ãã°ããŒãã«èŠæš¡ã§å±éããå Žåãç°ãªãå°åã«ååšãã倿§ãªãããã¯ãŒã¯ç¶æ³ãšã€ã³ãã©ã¹ãã©ã¯ãã£ã®å¶éãèæ ®ããããšãäžå¯æ¬ ã§ãã以äžã«ããã€ãã®äž»èŠãªèæ ®äºé ã瀺ããŸãã
1. ãããã¯ãŒã¯ã€ã³ãã©ã¹ãã©ã¯ãã£ã®å€åæ§
ãããã¯ãŒã¯ã€ã³ãã©ã¹ãã©ã¯ãã£ã¯äžçäžã§å€§ããç°ãªããŸããäžéšã®å°åã«ã¯ããéçºãããé«åž¯åå¹ ãããã¯ãŒã¯ããããŸãããä»ã®å°åã§ã¯åž¯åå¹ ãéãããŠãããæ¥ç¶ãäžå®å®ã§ããWebRTCã¢ããªã±ãŒã·ã§ã³ãèšèšããéã«ã¯ããããã®éããèæ ®ããããŸããŸãªãããã¯ãŒã¯ç¶æ³ã«é©å¿ããããã®æŠç¥ãå®è£ ããããšãéèŠã§ããããã«ã¯ãã¢ãããã£ããããã¬ãŒãã¹ããªãŒãã³ã°ãè§£å床åãæ¿ããããã³äœåž¯åå¹ ç°å¢ã§ã®ããã©ãŒãã³ã¹ãæé©åããããã®ãã®ä»ã®æè¡ãå«ãŸããŸãã
2. èŠå¶ããã³æ³çé å®
ç°ãªãåœã¯ãããŒã¿ãã©ã€ãã·ãŒãã»ãã¥ãªãã£ãããã³éä¿¡ã«é¢ããŠç°ãªãèŠå¶ããã³æ³çèŠä»¶ãæã£ãŠããŸããWebRTCã¢ããªã±ãŒã·ã§ã³ãå±éãããå°åã®ãã¹ãŠã®é©çšãããæ³åŸããã³èŠå¶ã«æºæ ããŠããããšã確èªããŠãã ãããããã«ã¯ãç¹å®ã®ã»ãã¥ãªãã£å¯Ÿçã®å®è£ ãå¿ èŠãªã©ã€ã»ã³ã¹ã®ååŸããŸãã¯ããŒã¿ãã©ã€ãã·ãŒèŠå¶ã®é å®ãå«ãŸããå ŽåããããŸãã
3. èšèªãšããŒã«ã©ã€ãŒãŒã·ã§ã³
çã«ã°ããŒãã«ãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããã«ã¯ãWebRTCã¢ããªã±ãŒã·ã§ã³ãããŸããŸãªèšèªãšæåã«åãããŠããŒã«ã©ã€ãºããããšãäžå¯æ¬ ã§ããããã«ã¯ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã®ç¿»èš³ãããŒã«ã©ã€ãºãããããã¥ã¡ã³ãã®æäŸãããã³æåçãªèŠç¯ã奜ã¿ã«ã¢ããªã±ãŒã·ã§ã³ãé©å¿ãããããšãå«ãŸããŸãã
4. ã¿ã€ã ãŸãŒã³ã«é¢ããèæ ®äºé
ãªã¢ã«ã¿ã€ã éä¿¡ã¢ããªã±ãŒã·ã§ã³ãèšèšããéã«ã¯ããŠãŒã¶ãŒãæåšããç°ãªãã¿ã€ã ãŸãŒã³ãèæ ®ããããšãéèŠã§ããç°ãªãã¿ã€ã ãŸãŒã³ã®ãŠãŒã¶ãŒã«ãšã£ãŠäŸ¿å©ãªäŒè°ãã€ãã³ããã¹ã±ãžã¥ãŒã«ããæ©èœãå®è£ ããŠãã ããããŸããã¢ããªã±ãŒã·ã§ã³ããŠãŒã¶ãŒã®çŸå°ã¿ã€ã ãŸãŒã³ã§æéã衚瀺ããããšã確èªããŠãã ããã
5. ã³ã³ãã³ãããªããªãŒãããã¯ãŒã¯ïŒCDNïŒ
ã³ã³ãã³ãããªããªãŒãããã¯ãŒã¯ïŒCDNïŒã¯ãã³ã³ãã³ãããŠãŒã¶ãŒã«ããè¿ãå Žæã«ãã£ãã·ã¥ããããšã§ãWebRTCã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãšä¿¡é Œæ§ãåäžãããããšãã§ããŸããããã«ãããé å»¶ãæžå°ããç¹ã«å°ççã«é ãå Žæã«ãããŠãŒã¶ãŒã«ãšã£ãŠãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåäžããŸããç»åããããªãJavaScriptãã¡ã€ã«ãªã©ã®éçã¢ã»ãããé ä¿¡ããããã«CDNã®äœ¿çšãæ€èšããŠãã ããã
6. ããŒã«ã©ã€ãºããããµããŒããšãã©ãã«ã·ã¥ãŒãã£ã³ã°
ç°ãªãå°åã®ãŠãŒã¶ãŒãæ¯æŽããããã«ãããŒã«ã©ã€ãºããããµããŒããšãã©ãã«ã·ã¥ãŒãã£ã³ã°ãªãœãŒã¹ãæäŸããŸããããã«ã¯ãå€èšèªå¯Ÿå¿ã®ãµããŒãã¹ã¿ããã®éçšãããŒã«ã©ã€ãºãããããã¥ã¡ã³ãã®äœæãããã³ç°ãªãèšèªã§ã®ãã©ãã«ã·ã¥ãŒãã£ã³ã°ã¬ã€ãã®æäŸãå«ãŸããå ŽåããããŸãã
çŸå®äžçã®äŸãšãŠãŒã¹ã±ãŒã¹
WebRTCæ¥ç¶å質ã¢ãã¿ãªã³ã°ã¯ãããŸããŸãªçŸå®äžçã®ã¢ããªã±ãŒã·ã§ã³ã§éèŠã§ãã
- ãããªäŒè°: ãªã¢ãŒãäŒè°ãå ±åäœæ¥ã®ããã«ãå®å®ããé«å質ã®ãããªé話ãä¿èšŒããŸãã
- ãªã³ã©ã€ã³æè²: ãããã¯ãŒã¯ç¶æ³ãå€åããŠããåŠçãè¬åž«ã«ã·ãŒã ã¬ã¹ãªåŠç¿äœéšãæäŸããŸãã
- é éå»ç: ä¿¡é Œæ§ãé«ãå®å šãªé éå»ççžè«ãå¯èœã«ããŸãã
- ã©ã€ãã¹ããªãŒãã³ã°: äžçäžã®èŠèŽè ã«é«å質ã®ã©ã€ããããªã¹ããªãŒã ãé ä¿¡ããŸãã
- ãªã³ã©ã€ã³ã²ãŒã : ãªã¢ã«ã¿ã€ã ãã«ããã¬ã€ã€ãŒã²ãŒã ã®ããã«ãäœé å»¶ã§å®å®ããæ¥ç¶ãç¶æããŸãã
äŸïŒã°ããŒãã«ãããªäŒè°ãã©ãããã©ãŒã
äžçäžã®äŒæ¥ãå人ã䜿çšãããããªäŒè°ãã©ãããã©ãŒã ãæ³åããŠãã ããããã¹ãŠã®ãŠãŒã¶ãŒã«äžè²«ããä¿¡é Œæ§ã®é«ããšã¯ã¹ããªãšã³ã¹ãä¿èšŒããããã«ããã©ãããã©ãŒã ã¯å æ¬çãªããã³ããšã³ãWebRTCæ¥ç¶å質ã¢ãã¿ãªã³ã°ãå®è£ ããŠããŸãããã©ãããã©ãŒã ã¯ãè²åããããã€ã³ãžã±ãŒã¿ãŒã䜿çšããŠãäŒè°ã®ååå è ã«æ¥ç¶å質ã衚瀺ããŸãããŠãŒã¶ãŒãæ¥ç¶å質ã®äœäžãçµéšããå Žåããã©ãããã©ãŒã ã¯èªåçã«ãããªè§£å床ã調æŽããŠå®å®ããæ¥ç¶ãç¶æããŸãããã©ãããã©ãŒã ã¯ãŸãããããã¯ãŒã¯æ¥ç¶ãæ¹åããããã®ãã©ãã«ã·ã¥ãŒãã£ã³ã°ã®ãã³ããšææ¡ããŠãŒã¶ãŒã«æäŸããŸãã
çµè«
ããã³ããšã³ãWebRTCæ¥ç¶å質ã¢ãã¿ãªã³ã°ã¯ãå ç¢ã§ä¿¡é Œæ§ã®é«ããªã¢ã«ã¿ã€ã éä¿¡ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®äžå¯æ¬ ãªåŽé¢ã§ããäž»èŠãªã¡ããªã¯ã¹ãçè§£ããã¢ãã¿ãªã³ã°æè¡ãå®è£ ãããããã¯ãŒã¯ç¶æ³ã«é©å¿ããããšã§ããŠãŒã¶ãŒã®å Žæããããã¯ãŒã¯ç°å¢ã«é¢ä¿ãªããã·ãŒã ã¬ã¹ã§æ¥œãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãä¿èšŒã§ããŸããWebRTCãé²åãç¶ããæ°ããæè¡ãç»å Žããã«ã€ããŠãææ°ã®ãã¹ããã©ã¯ãã£ã¹ãšæè¡ã«ã€ããŠæ å ±ãåžžã«ææ¡ããŠããããšããæå 端ã®ãªã¢ã«ã¿ã€ã ãšã¯ã¹ããªãšã³ã¹ãæäŸããããã«äžå¯æ¬ ã«ãªããŸãã
WebRTCæ¥ç¶ãç©æ¥µçã«ç£èŠããã³æé©åããããšã§ããŠãŒã¶ãŒæºè¶³åºŠãå€§å¹ ã«åäžããããµããŒãã³ã¹ããåæžããæ¥éã«é²åãããªã¢ã«ã¿ã€ã éä¿¡ã®äžçã§ç«¶äºäžã®åªäœæ§ãç²åŸã§ããŸãã